/** @file
  Type definitions related to the VBE (VESA BIOS Extension, Int10h AH=4Fh)
  services GET INFORMATION (AL=00h) and GET MODE INFORMATION (AL=01h).

  For reference, see Ralf Brown's Interrupt List:
  <http://www.cs.cmu.edu/~ralf/files.html>
  <http://www.ctyme.com/rbrown.htm>

  Copyright (C) 2014, Red Hat, Inc.

  SPDX-License-Identifier: BSD-2-Clause-Patent
**/

#ifndef __LEGACY_VGA_BIOS_H__
#define __LEGACY_VGA_BIOS_H__

#include <Base.h>

#pragma pack (1)
typedef struct {
  UINT8  Signature[4];
  UINT16 VesaVersion;
  UINT32 OemNameAddress;
  UINT32 Capabilities;
  UINT32 ModeListAddress;
  UINT16 VideoMem64K;
  UINT16 OemSoftwareVersion;
  UINT32 VendorNameAddress;
  UINT32 ProductNameAddress;
  UINT32 ProductRevAddress;
} VBE_INFO_BASE;

typedef struct {
  VBE_INFO_BASE  Base;
  UINT8          Buffer[256 - sizeof (VBE_INFO_BASE)];
} VBE_INFO;

typedef struct {
  UINT16 ModeAttr;
  UINT8  WindowAAttr;
  UINT8  WindowBAttr;
  UINT16 WindowGranularityKB;
  UINT16 WindowSizeKB;
  UINT16 WindowAStartSegment;
  UINT16 WindowBStartSegment;
  UINT32 WindowPositioningAddress;
  UINT16 BytesPerScanLine;

  UINT16 Width;
  UINT16 Height;
  UINT8  CharCellWidth;
  UINT8  CharCellHeight;
  UINT8  NumPlanes;
  UINT8  BitsPerPixel;
  UINT8  NumBanks;
  UINT8  MemoryModel;
  UINT8  BankSizeKB;
  UINT8  NumImagePagesLessOne;
  UINT8  Vbe3;

  UINT8  RedMaskSize;
  UINT8  RedMaskPos;
  UINT8  GreenMaskSize;
  UINT8  GreenMaskPos;
  UINT8  BlueMaskSize;
  UINT8  BlueMaskPos;
  UINT8  ReservedMaskSize;
  UINT8  ReservedMaskPos;
  UINT8  DirectColorModeInfo;

  UINT32 LfbAddress;
  UINT32 OffScreenAddress;
  UINT16 OffScreenSizeKB;

  UINT16 BytesPerScanLineLinear;
  UINT8  NumImagesLessOneBanked;
  UINT8  NumImagesLessOneLinear;
  UINT8  RedMaskSizeLinear;
  UINT8  RedMaskPosLinear;
  UINT8  GreenMaskSizeLinear;
  UINT8  GreenMaskPosLinear;
  UINT8  BlueMaskSizeLinear;
  UINT8  BlueMaskPosLinear;
  UINT8  ReservedMaskSizeLinear;
  UINT8  ReservedMaskPosLinear;
  UINT32 MaxPixelClockHz;
  UINT8  Reserved[190];
} VBE_MODE_INFO;

typedef struct {
  UINT16 ModeAttr;
  UINT8  WindowAAttr;
  UINT8  WindowBAttr;
  UINT16 WindowGranularityKB;
  UINT16 WindowSizeKB;
  UINT16 WindowAStartSegment;
  UINT16 WindowBStartSegment;
  UINT32 WindowPositioningAddress;
  UINT16 BytesPerScanLine;

  UINT16 Width;
  UINT16 Height;
  UINT8  CharCellWidth;
  UINT8  CharCellHeight;
  UINT8  NumPlanes;
  UINT8  BitsPerPixel;
  UINT8  NumBanks;
  UINT8  MemoryModel;
  UINT8  BankSizeKB;
  UINT8  NumImagePagesLessOne;
  UINT8  Vbe3;

  UINT8  RedMaskSize;
  UINT8  RedMaskPos;
  UINT8  GreenMaskSize;
  UINT8  GreenMaskPos;
  UINT8  BlueMaskSize;
  UINT8  BlueMaskPos;
  UINT8  ReservedMaskSize;
  UINT8  ReservedMaskPos;
  UINT8  DirectColorModeInfo;

  UINT32 LfbAddress;
  UINT32 OffScreenAddress;
  UINT16 OffScreenSizeKB;
} VBE2_MODE_INFO;
#pragma pack ()

#endif
